
package com.eva.framework.dbpool;

/**
 * 针对特定数据库的相关实用方法.<br>
 * 本类里的所有实用方法都是据 {@link DBShell#DB_TYPE}来获知哪种数据库类型的，换句话说要设置哪种DB类型
 * 只要去DBShell中设置 DBShell#DB_TYPE即可.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 * @see DBShell#DB_TYPE
 */
public class DBDepend
{
	/** Oracle date pattern：yyyy-mm */
	public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM = "\'yyyy-mm\'";
	/** Oracle date pattern：yyyy-mm-dd */
	public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM$DD = "\'yyyy-mm-dd\'";
	/** Oracle date pattern：hh24:mi */
	public static final String SQL_ORACLE$DATE$PATTERN_HH24$MI = "\'hh24:mi\'";
	/** Oracle date pattern：hh24:mi:ss */
	public static final String SQL_ORACLE$DATE$PATTERN_HH24$MI$SS = "\'hh24:mi:ss\'";
	/** Oracle date pattern：yyyy-mm-dd hh24:mi */
	public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM$DD_HH24$MI = "\'yyyy-mm-dd hh24:mi\'";
	/** Oracle date pattern：yyyy-mm-dd hh24:mi:ss */
	public static final String SQL_ORACLE$DATE$PATTERN_YYYY$MM$DD_HH24$MI$SS = "\'yyyy-mm-dd hh24:mi:ss\'";
	
	/** Oracle默认时间函数 */
	public static final String SQL_ORACLE$DEFAULT$DATETIME$FUNC = "sysdate";
	/** SQLServer默认时间函数 */
	public static final String SQL_SQLSERVER$DEFAULT$DATETIME$FUNC = "getDate()";
	/** MySQL默认时间函数 */
	public static final String SQL_MYSQL$DEFAULT$DATETIME$FUNC = "now()";
	
	/** Oracle NULL取值函数 */
	public static final String SQL_ORACLE_NVL = "NVL";
	/** SQLServer NULL取值函数 */
	public static final String SQL_SQLSERVER_NVL = "ISNULL";
	/** MySQL NULL取值函数 */
	public static final String SQL_MYSQL_NVL = "IFNULL";
	
	/**
	 * 特殊处理order by 语句.<br>
	 * 目前可知的是，oralce和sql server的order by 语句对null值的处理不一样，oracle把它作为最大值处理，而sql server则相反，为了
	 * 使其二者表现一致则有了本字段标明db类型，以便特殊处理各数据库，使得在处理order by时能表现一致（把null值作最小值处理）
	 * 
	 * @param originalOrderStr 原始的未经加工的order by 语句字段片段，如:"someFieldName"
	 * @return
	 */
	public static String specialForOrderBy(String originalOrderStr)
	{
		switch(DBShell.DB_TYPE)
		{
			case sqlServer:
				return originalOrderStr;
			case oracle:
				return "NVL("+originalOrderStr+",' ')";
			default:
				return originalOrderStr;
		}
	}
	
	/**
	 * 返回对应数据库的默认日期时间函数。
	 * 
	 */
	public static String getDefaultDatetimeFunc()
	{
		switch(DBShell.DB_TYPE)
		{
			case sqlServer:
				return SQL_SQLSERVER$DEFAULT$DATETIME$FUNC;
			case oracle:
				return SQL_ORACLE$DEFAULT$DATETIME$FUNC;
			case mySql:
				return SQL_MYSQL$DEFAULT$DATETIME$FUNC;
			default:
				return "undefine";
		}
	}
	
	/**
	 * 返回NULL空值函数。
	 * 
	 * @return
	 */
	public static String getNVLFunc(String expr1 ,String expr2)
	{
		switch(DBShell.DB_TYPE)
		{
			case sqlServer:
				return SQL_SQLSERVER_NVL+"("+expr1+","+expr2+")";
			case oracle:
				return SQL_ORACLE_NVL+"("+expr1+","+expr2+")";
			case mySql:
				return SQL_MYSQL_NVL+"("+expr1+","+expr2+")";
			default:
				return "undefine";
		}
	}
	
	/**
	 * 返回与当前时间的时间差计算函数。
	 * 
	 * @return
	 */
	public static String getTIMEDIFF(String UNIT, String timeFieldOfTable)
	{
		// 通过SQL的函数计算数据库中聊天消息与当前时间的时间差
		switch(DBShell.DB_TYPE)
		{
			case sqlServer:
				return "DATEDIFF("+UNIT+", "+timeFieldOfTable+",getDate())";
			case oracle:
				return "";// TODO 暂未实现！
			case mySql:
				return "TIMESTAMPDIFF("+UNIT+", "+timeFieldOfTable+",now())";
			default:
				return "undefine";
		}
	}

//	public static String getToDateStr(String dateStr, String javaDateFormat)
//	{
//		return getToDateStr(DBShell.DB_TYPE,dateStr,javaDateFormat);
//	}
//    public static String getToDateStr(DBType dbType, String dateStr, String javaDateFormat)
//    {
//        SimpleDateFormat sdf = new SimpleDateFormat(javaDateFormat);
//        java.util.Date dt = null;
//        try{
//            dt = sdf.parse(dateStr);
//        }
//        catch(Exception ex){
//            throw new IllegalArgumentException("日期字符串与日期格式不一致.");
//        }
//        return getToDateStr(dbType, dt);
//    }
//    public static String getToDateStr(DBType dbType, java.util.Date dt)
//    {
//        long time = dt.getTime();
//        Date sdt = new Date(time);
//        Time stm = new Time(time);
//        switch(dbType)
//        {
//        	case oracle: // '1'
//        		return (new StringBuilder()).append("to_date('").append(sdt.toString())
//        		.append(" ").append(stm.toString()).append("','yyyy-MM-dd HH24:min:ss')").toString();
//
//        	case sqlServer: // '2'
//        		return (new StringBuilder()).append("'").append(sdt.toString()).append(" ")
//        		.append(stm.toString()).append("'").toString();
//        }
//        return (new StringBuilder()).append("'").append(sdt.toString()).append(" ")
//        	.append(stm.toString()).append("'").toString();
//    }
}
